
import 'package:flutter/material.dart';

///自定义组件
///1、组合其他组件：
///   Container由DecorateBox、ConstrainedBox、Transform、Padding、Align等组件组成
///2、自绘:
///   通过CustomPaint和Canvas实现自绘，根据和android的自定义View差不多；
///3、实现RenderObject；
///   Flutter提供自身具有UI外观的组件，如文本Text、Image都是通过相应的RenderObject渲染出来，
///   比如Text是由RenderParagraph渲染，而Image是由RenderImage渲染。RenderObject是一个抽
///   象类，它定义了一个抽象方法paint(PaintingContext context，Offset offset),PaintingContext
///   代表组件的绘制上下文，通过PaintContext.canvas可以获得Canvas，而绘制逻辑主要是通过Canvas
///   API来实现。
///区别：
///   CustomPaint只是为了方便开发者封装的一个代理类，它继承SingleChildRenderObjectWidget，
///   通过RenderCustomPaint的paint方法将Canvas和画笔Painter连接起来实现了最终的绘制（绘制
///   逻辑再Painter中）
///总结：
///   "组合"是自定义组件最简单的方法，在任何需要自定义组件的场景下，我们都应该优先考虑是否能够通过
///   组合来实现。而通过CustomPaint和RenderObject自绘的方式本质上是一样的，都需要开发者调用
///   Canvas API手动去绘制UI，优点是强大灵活，理论上可以实现任何外观的UI，而缺点是必须了解Canvas
///   API细节，并且得自己去实现绘制逻辑。
class CustomViewPage extends StatefulWidget{
  @override
  State<StatefulWidget> createState() => _CustomViewState();

}

class _CustomViewState extends State<CustomViewPage>{
  @override
  Widget build(BuildContext context) {
    throw UnimplementedError();
  }

}